package ar.edu.unq.persistencia.gpilla;

import java.util.ArrayList;
import java.util.List;

import ar.edu.unq.persistencia.gpilla.exceptions.FormacionEquipoIncompletoException;

public abstract class FormacionAbstract implements FormacionStrategy {

    protected List<Posicion> tactica;

    @Override
    public Formacion armarFormacion(final Equipo equipo) {
        if (equipo.getCantidadJugadores() < 11) {
            throw new FormacionEquipoIncompletoException("El equipo solo cuenta con " + equipo.getCantidadJugadores()
                    + " y necesita como minimo 11");
        }
        List<Jugador> jugadores = new ArrayList<Jugador>(equipo.getJugadores());
        List<Titular> titulares = this.calcularTitulares(jugadores);
        return new Formacion(titulares, jugadores, equipo);
    }

    protected List<Titular> calcularTitulares(final List<Jugador> jugadores) {
        List<Titular> titulares = new ArrayList<Titular>();
        for (Posicion posicion : this.tactica) {
            Jugador jugador = this.getMejorJugadorEnPosicion(jugadores, posicion);
            jugadores.remove(jugador);
            titulares.add(new Titular(jugador, posicion));
        }
        return titulares;
    }

    public Jugador getMejorJugadorEnPosicion(final List<Jugador> jugadores, final Posicion posicion) {
        Jugador mejorJugador = null;
        for (Jugador jugador : jugadores) {
            int habilidad = jugador.getValorHabilidad(posicion);
            if (mejorJugador == null || habilidad > mejorJugador.getValorHabilidad(posicion)) {
                mejorJugador = jugador;
            }
        }
        return mejorJugador;
    }
}
